/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package polylifegame.view;

import java.awt.BorderLayout;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import polylifegame.model.Case;
import polylifegame.model.Environnement;
import polylifegame.model.SimulateurManager;

/**
 *
 * @author epulapp
 */
public final class VuePrincipale extends JFrame implements Observer {
    
    //<editor-fold defaultstate="collapsed" desc="Variables de classe">
    //Taille de la fenêtre
    private final Integer  FRAMESIZEX = 1024;
    private final Integer  FRAMESIZEY = 768;
    
    //Panel principal
    private JPanel  jpPrincipal;
    //Conteneur Menu
    private JMenuBar jpMenu;
    //Conteneur Grille
    private GrilleView jpGrille;
    //Conteneur des boutons
    private ButtonsView jpBoutons;
    
    //Référence sur l'environnement
    private Environnement environnement;
    //Référence sur le simulateurManager
    private SimulateurManager simulateur;
    
    //Switch pour le mode survol
    private Boolean isMouseOverActivated;
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="Constructeurs">
    /**
     * Constructeur
     * @param environnement : Environnement courant
     * @param simulateur : Référence de simulateur Manager
     * @param sizeX : Taille X  
     * @param sizeY : Taille Y
     */
    public VuePrincipale(Environnement environnement, SimulateurManager simulateur, Integer sizeX, Integer sizeY){
        //Titre de la fenêtre
        super("Jeu de la vie");
        //Taille de la fenêtre
        this.setSize(FRAMESIZEX, FRAMESIZEY);
        //Centrage de la fenêtre
        this.setLocationRelativeTo(null);
        
        //Survol non actif par défaut
        this.isMouseOverActivated = false;
        
        //Référence sur l'environnement courant
        this.environnement = environnement;
        //Référence sur le simulateur courant
        this.simulateur = simulateur;
        
        initPanelPrincipal();
        initMenu();
        initGrille(sizeX,sizeY);
        initBoutons();
        
        //Affichage de la fenêtre
        this.setVisible(true);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        
    }
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="Méthodes de classe">
    /**
     * Mise a jour de la grille
     * @param o
     * @param arg : Tableau de case
     */
    @Override
    public void update(Observable o, Object arg) {
        this.jpGrille.drawGameTable((Case[][]) arg);
    }
    
    public void initPanelPrincipal(){
        //JPanel principal ajouté à la fenêtre
        this.jpPrincipal = new JPanel(new BorderLayout());
        this.setContentPane(this.jpPrincipal);
    }
    
    public void initMenu(){
        this.jpMenu = new MenuView(this, this.environnement, this.simulateur);
        this.setJMenuBar(this.jpMenu);
    }
    
    public void initGrille(Integer sizeX, Integer sizeY){
        this.jpGrille = new GrilleView(this, this.environnement,sizeX,sizeY);
        this.jpPrincipal.add(this.jpGrille, BorderLayout.CENTER);
    }
    
    public void initBoutons(){
        //JPanel boutons ajouté au JPanel Principal
        this.jpBoutons = new ButtonsView(this, this.environnement, this.simulateur, this.isMouseOverActivated);
        this.jpPrincipal.add(this.jpBoutons, BorderLayout.WEST);
    }
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="Getter/Setter">
    public void setIsMouseOverActivated(Boolean isMouseOverActivated) {
        this.isMouseOverActivated = isMouseOverActivated;
    }
    
    public Boolean getIsMouseOverActivated() {
        return isMouseOverActivated;
    }
    //</editor-fold>

}
